Added two new signals to GtkSpinButton, "input" and "output", to make the
authorStefan Jeske <stefan@src.gnome.org>
Sun, 28 Feb 1999 16:04:47 +0000 (16:04 +0000)
committerStefan Jeske <stefan@src.gnome.org>
Sun, 28 Feb 1999 16:04:47 +0000 (16:04 +0000)
* gtk/gtkspinbutton.[c,h] gtk/testgtk.c: Added two new signals to
GtkSpinButton, "input" and "output", to make the output more flexible.
  The user has to provide a mapping between adjustment->value and the
  output string (and vice versa, if the spin button is editable).
See testgtk for examples.

ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
gtk/gtkspinbutton.c
gtk/gtkspinbutton.h
gtk/testgtk.c
tests/testgtk.c

index f12cd2c4cec70f29f35dc12ca15558ec74618627..5c8a5f7596393465b2a16090842e28a83554567f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Sun Feb 28 16:46:02 1999  Stefan Jeske  <stefan@gtk.org>
+
+       * gtk/gtkspinbutton.[c,h] gtk/testgtk.c: Added two new signals to 
+       GtkSpinButton, "input" and "output", to make the output more flexible.
+       The user has to provide a mapping between adjustment->value and the
+       output string (and vice versa, if the spin button is editable). 
+       See testgtk for examples.
+
 Sat Feb 27 01:18:47 1999  Tim Janik  <timj@gtk.org>
 
        * ChangeLog: moved old ChangeLog to ChangeLog.pre-1-2, and started
index f12cd2c4cec70f29f35dc12ca15558ec74618627..5c8a5f7596393465b2a16090842e28a83554567f 100644 (file)
@@ -1,3 +1,11 @@
+Sun Feb 28 16:46:02 1999  Stefan Jeske  <stefan@gtk.org>
+
+       * gtk/gtkspinbutton.[c,h] gtk/testgtk.c: Added two new signals to 
+       GtkSpinButton, "input" and "output", to make the output more flexible.
+       The user has to provide a mapping between adjustment->value and the
+       output string (and vice versa, if the spin button is editable). 
+       See testgtk for examples.
+
 Sat Feb 27 01:18:47 1999  Tim Janik  <timj@gtk.org>
 
        * ChangeLog: moved old ChangeLog to ChangeLog.pre-1-2, and started
index f12cd2c4cec70f29f35dc12ca15558ec74618627..5c8a5f7596393465b2a16090842e28a83554567f 100644 (file)
@@ -1,3 +1,11 @@
+Sun Feb 28 16:46:02 1999  Stefan Jeske  <stefan@gtk.org>
+
+       * gtk/gtkspinbutton.[c,h] gtk/testgtk.c: Added two new signals to 
+       GtkSpinButton, "input" and "output", to make the output more flexible.
+       The user has to provide a mapping between adjustment->value and the
+       output string (and vice versa, if the spin button is editable). 
+       See testgtk for examples.
+
 Sat Feb 27 01:18:47 1999  Tim Janik  <timj@gtk.org>
 
        * ChangeLog: moved old ChangeLog to ChangeLog.pre-1-2, and started
index f12cd2c4cec70f29f35dc12ca15558ec74618627..5c8a5f7596393465b2a16090842e28a83554567f 100644 (file)
@@ -1,3 +1,11 @@
+Sun Feb 28 16:46:02 1999  Stefan Jeske  <stefan@gtk.org>
+
+       * gtk/gtkspinbutton.[c,h] gtk/testgtk.c: Added two new signals to 
+       GtkSpinButton, "input" and "output", to make the output more flexible.
+       The user has to provide a mapping between adjustment->value and the
+       output string (and vice versa, if the spin button is editable). 
+       See testgtk for examples.
+
 Sat Feb 27 01:18:47 1999  Tim Janik  <timj@gtk.org>
 
        * ChangeLog: moved old ChangeLog to ChangeLog.pre-1-2, and started
index f12cd2c4cec70f29f35dc12ca15558ec74618627..5c8a5f7596393465b2a16090842e28a83554567f 100644 (file)
@@ -1,3 +1,11 @@
+Sun Feb 28 16:46:02 1999  Stefan Jeske  <stefan@gtk.org>
+
+       * gtk/gtkspinbutton.[c,h] gtk/testgtk.c: Added two new signals to 
+       GtkSpinButton, "input" and "output", to make the output more flexible.
+       The user has to provide a mapping between adjustment->value and the
+       output string (and vice versa, if the spin button is editable). 
+       See testgtk for examples.
+
 Sat Feb 27 01:18:47 1999  Tim Janik  <timj@gtk.org>
 
        * ChangeLog: moved old ChangeLog to ChangeLog.pre-1-2, and started
index f12cd2c4cec70f29f35dc12ca15558ec74618627..5c8a5f7596393465b2a16090842e28a83554567f 100644 (file)
@@ -1,3 +1,11 @@
+Sun Feb 28 16:46:02 1999  Stefan Jeske  <stefan@gtk.org>
+
+       * gtk/gtkspinbutton.[c,h] gtk/testgtk.c: Added two new signals to 
+       GtkSpinButton, "input" and "output", to make the output more flexible.
+       The user has to provide a mapping between adjustment->value and the
+       output string (and vice versa, if the spin button is editable). 
+       See testgtk for examples.
+
 Sat Feb 27 01:18:47 1999  Tim Janik  <timj@gtk.org>
 
        * ChangeLog: moved old ChangeLog to ChangeLog.pre-1-2, and started
index f12cd2c4cec70f29f35dc12ca15558ec74618627..5c8a5f7596393465b2a16090842e28a83554567f 100644 (file)
@@ -1,3 +1,11 @@
+Sun Feb 28 16:46:02 1999  Stefan Jeske  <stefan@gtk.org>
+
+       * gtk/gtkspinbutton.[c,h] gtk/testgtk.c: Added two new signals to 
+       GtkSpinButton, "input" and "output", to make the output more flexible.
+       The user has to provide a mapping between adjustment->value and the
+       output string (and vice versa, if the spin button is editable). 
+       See testgtk for examples.
+
 Sat Feb 27 01:18:47 1999  Tim Janik  <timj@gtk.org>
 
        * ChangeLog: moved old ChangeLog to ChangeLog.pre-1-2, and started
index 9fce7e58aec6c42c614a74864913fd4dba00d92f..7429efdb1a4622a6d557b488ed7ea5058aff7138 100644 (file)
@@ -59,6 +59,13 @@ enum {
   ARG_VALUE
 };
 
+/* Signals */
+enum
+{
+  INPUT,
+  OUTPUT,
+  LAST_SIGNAL
+};
 
 static void gtk_spin_button_class_init     (GtkSpinButtonClass *klass);
 static void gtk_spin_button_init           (GtkSpinButton      *spin_button);
@@ -113,9 +120,13 @@ static void gtk_spin_button_insert_text    (GtkEditable        *editable,
                                            gint               *position);
 static void gtk_spin_button_real_spin      (GtkSpinButton      *spin_button,
                                            gfloat              step);
+static gint gtk_spin_button_default_input  (GtkSpinButton      *spin_button,
+                                           gfloat             *new_val);
+static gint gtk_spin_button_default_output (GtkSpinButton      *spin_button);
 
 
 static GtkEntryClass *parent_class = NULL;
+static guint spinbutton_signals[LAST_SIGNAL] = {0};
 
 
 GtkType
@@ -191,12 +202,29 @@ gtk_spin_button_class_init (GtkSpinButtonClass *class)
                           GTK_TYPE_FLOAT,
                           GTK_ARG_READWRITE,
                           ARG_VALUE);
-  
 
   object_class->set_arg = gtk_spin_button_set_arg;
   object_class->get_arg = gtk_spin_button_get_arg;
   object_class->finalize = gtk_spin_button_finalize;
 
+  spinbutton_signals[INPUT] =
+    gtk_signal_new ("input",
+                   GTK_RUN_LAST,
+                   object_class->type,
+                   GTK_SIGNAL_OFFSET (GtkSpinButtonClass, input),
+                   gtk_marshal_INT__POINTER,
+                   GTK_TYPE_INT, 1, GTK_TYPE_POINTER);
+
+  spinbutton_signals[OUTPUT] =
+    gtk_signal_new ("output",
+                   GTK_RUN_LAST,
+                   object_class->type,
+                   GTK_SIGNAL_OFFSET (GtkSpinButtonClass, output),
+                   gtk_marshal_BOOL__NONE,
+                   GTK_TYPE_BOOL, 0);
+
+  gtk_object_class_add_signals (object_class, spinbutton_signals, LAST_SIGNAL);
+
   widget_class->map = gtk_spin_button_map;
   widget_class->unmap = gtk_spin_button_unmap;
   widget_class->realize = gtk_spin_button_realize;
@@ -216,6 +244,9 @@ gtk_spin_button_class_init (GtkSpinButtonClass *class)
 
   editable_class->insert_text = gtk_spin_button_insert_text;
   editable_class->activate = gtk_spin_button_activate;
+
+  class->input = NULL;
+  class->output = NULL;
 }
 
 static void
@@ -336,9 +367,8 @@ gtk_spin_button_init (GtkSpinButton *spin_button)
   spin_button->numeric = FALSE;
   spin_button->wrap = FALSE;
   spin_button->snap_to_ticks = FALSE;
-
   gtk_spin_button_set_adjustment (spin_button,
-                                 (GtkAdjustment*) gtk_adjustment_new (0, 0, 0, 0, 0, 0));
+         (GtkAdjustment*) gtk_adjustment_new (0, 0, 0, 0, 0, 0));
 }
 
 static void
@@ -381,15 +411,16 @@ gtk_spin_button_unmap (GtkWidget *widget)
 static void
 gtk_spin_button_realize (GtkWidget *widget)
 {
-  GtkSpinButton *spin;
+  GtkSpinButton *spin_button;
   GdkWindowAttr attributes;
   gint attributes_mask;
   guint real_width;
+  gint return_val;
 
   g_return_if_fail (widget != NULL);
   g_return_if_fail (GTK_IS_SPIN_BUTTON (widget));
   
-  spin = GTK_SPIN_BUTTON (widget);
+  spin_button = GTK_SPIN_BUTTON (widget);
 
   real_width = widget->allocation.width;
   widget->allocation.width -= ARROW_SIZE + 2 * widget->style->klass->xthickness;
@@ -417,11 +448,17 @@ gtk_spin_button_realize (GtkWidget *widget)
   attributes.width = ARROW_SIZE + 2 * widget->style->klass->xthickness;
   attributes.height = widget->requisition.height;
   
-  spin->panel = gdk_window_new (gtk_widget_get_parent_window (widget), 
-                               &attributes, attributes_mask);
-  gdk_window_set_user_data (spin->panel, widget);
+  spin_button->panel = gdk_window_new (gtk_widget_get_parent_window (widget), 
+                                      &attributes, attributes_mask);
+  gdk_window_set_user_data (spin_button->panel, widget);
 
-  gtk_style_set_background (widget->style, spin->panel, GTK_STATE_NORMAL);
+  gtk_style_set_background (widget->style, spin_button->panel, GTK_STATE_NORMAL);
+
+  return_val = FALSE;
+  gtk_signal_emit (GTK_OBJECT (spin_button), spinbutton_signals[OUTPUT],
+                  &return_val);
+  if (return_val == FALSE)
+    gtk_spin_button_default_output (spin_button);
 }
 
 static void
@@ -957,13 +994,16 @@ static void
 gtk_spin_button_value_changed (GtkAdjustment *adjustment,
                               GtkSpinButton *spin_button)
 {
-  char buf[MAX_TEXT_LENGTH];
+  gint return_val;
 
   g_return_if_fail (adjustment != NULL);
   g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment));
 
-  sprintf (buf, "%0.*f", spin_button->digits, adjustment->value);
-  gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
+  return_val = FALSE;
+  gtk_signal_emit (GTK_OBJECT (spin_button), spinbutton_signals[OUTPUT],
+                  &return_val);
+  if (return_val == FALSE)
+    gtk_spin_button_default_output (spin_button);
 }
 
 static gint
@@ -1112,57 +1152,11 @@ gtk_spin_button_snap (GtkSpinButton *spin_button,
     gtk_adjustment_set_value (spin_button->adjustment, val);
   else
     {
-      char buf[MAX_TEXT_LENGTH];
-
-      sprintf (buf, "%0.*f", spin_button->digits, 
-              spin_button->adjustment->value);
-      if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
-       gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
-    }
-}
-
-void 
-gtk_spin_button_update (GtkSpinButton *spin_button)
-{
-  gfloat val;
-  gchar *error = NULL;
-
-  g_return_if_fail (spin_button != NULL);
-  g_return_if_fail (GTK_IS_SPIN_BUTTON (spin_button));
-
-  val = strtod (gtk_entry_get_text (GTK_ENTRY (spin_button)), &error);
-
-  if (spin_button->update_policy == GTK_UPDATE_ALWAYS)
-    {
-      if (val < spin_button->adjustment->lower)
-       val = spin_button->adjustment->lower;
-      else if (val > spin_button->adjustment->upper)
-       val = spin_button->adjustment->upper;
-    }
-  else if ((spin_button->update_policy == GTK_UPDATE_IF_VALID) && 
-          (*error ||
-          val < spin_button->adjustment->lower ||
-          val > spin_button->adjustment->upper))
-    {
-      gtk_spin_button_value_changed (spin_button->adjustment, spin_button);
-      return;
-    }
-
-  if (spin_button->snap_to_ticks)
-    gtk_spin_button_snap (spin_button, val);
-  else
-    {
-      if (fabs (val - spin_button->adjustment->value) > EPSILON)
-       gtk_adjustment_set_value (spin_button->adjustment, val);
-      else
-       {
-         char buf[MAX_TEXT_LENGTH];
-         
-         sprintf (buf, "%0.*f", spin_button->digits, 
-                  spin_button->adjustment->value);
-         if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
-           gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
-       }
+      gint return_val = FALSE;
+      gtk_signal_emit (GTK_OBJECT (spin_button), spinbutton_signals[OUTPUT],
+                      &return_val);
+      if (return_val == FALSE)
+       gtk_spin_button_default_output (spin_button);
     }
 }
 
@@ -1306,6 +1300,30 @@ gtk_spin_button_real_spin (GtkSpinButton *spin_button,
     gtk_adjustment_set_value (adj, new_value);
 }
 
+static gint
+gtk_spin_button_default_input (GtkSpinButton *spin_button,
+                              gfloat        *new_val)
+{
+  gchar *err = NULL;
+
+  *new_val = strtod (gtk_entry_get_text (GTK_ENTRY (spin_button)), &err);
+  if (*err)
+    return INPUT_ERROR;
+  else
+    return FALSE;
+}
+
+static gint
+gtk_spin_button_default_output (GtkSpinButton *spin_button)
+{
+  gchar buf[MAX_TEXT_LENGTH];
+
+  sprintf (buf, "%0.*f", spin_button->digits, spin_button->adjustment->value);
+  if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
+    gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
+  return FALSE;
+}
+
 
 /***********************************************************
  ***********************************************************
@@ -1438,12 +1456,11 @@ gtk_spin_button_set_value (GtkSpinButton *spin_button,
     gtk_adjustment_set_value (spin_button->adjustment, value);
   else
     {
-      char buf[MAX_TEXT_LENGTH];
-
-      sprintf (buf, "%0.*f", spin_button->digits, 
-               spin_button->adjustment->value);
-      if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
-        gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
+      gint return_val = FALSE;
+      gtk_signal_emit (GTK_OBJECT (spin_button), spinbutton_signals[OUTPUT],
+                      &return_val);
+      if (return_val == FALSE)
+       gtk_spin_button_default_output (spin_button);
     }
 }
 
@@ -1506,14 +1523,8 @@ gtk_spin_button_set_snap_to_ticks (GtkSpinButton *spin_button,
   if (new_val != spin_button->snap_to_ticks)
     {
       spin_button->snap_to_ticks = new_val;
-      if (new_val)
-       {
-         gchar *error = NULL;
-         gfloat val;
-
-         val = strtod (gtk_entry_get_text (GTK_ENTRY (spin_button)), &error);
-         gtk_spin_button_snap (spin_button, val);
-       }
+      if (new_val && GTK_EDITABLE (spin_button)->editable)
+       gtk_spin_button_update (spin_button);
     }
 }
 
@@ -1586,3 +1597,57 @@ gtk_spin_button_spin (GtkSpinButton *spin_button,
       break;
     }
 }
+
+void 
+gtk_spin_button_update (GtkSpinButton *spin_button)
+{
+  gfloat val;
+  gint error = 0;
+  gint return_val;
+
+  g_return_if_fail (spin_button != NULL);
+  g_return_if_fail (GTK_IS_SPIN_BUTTON (spin_button));
+
+  return_val = FALSE;
+  gtk_signal_emit (GTK_OBJECT (spin_button), spinbutton_signals[INPUT],
+                  &val, &return_val);
+  if (return_val == FALSE)
+    {
+      return_val = gtk_spin_button_default_input (spin_button, &val);
+      error = (return_val == INPUT_ERROR);
+    }
+  else if (return_val == INPUT_ERROR)
+    error = 1;
+
+  if (spin_button->update_policy == GTK_UPDATE_ALWAYS)
+    {
+      if (val < spin_button->adjustment->lower)
+       val = spin_button->adjustment->lower;
+      else if (val > spin_button->adjustment->upper)
+       val = spin_button->adjustment->upper;
+    }
+  else if ((spin_button->update_policy == GTK_UPDATE_IF_VALID) && 
+          (error ||
+          val < spin_button->adjustment->lower ||
+          val > spin_button->adjustment->upper))
+    {
+      gtk_spin_button_value_changed (spin_button->adjustment, spin_button);
+      return;
+    }
+
+  if (spin_button->snap_to_ticks)
+    gtk_spin_button_snap (spin_button, val);
+  else
+    {
+      if (fabs (val - spin_button->adjustment->value) > EPSILON)
+       gtk_adjustment_set_value (spin_button->adjustment, val);
+      else
+       {
+         return_val = FALSE;
+         gtk_signal_emit (GTK_OBJECT (spin_button), spinbutton_signals[OUTPUT],
+                          &return_val);
+         if (return_val == FALSE)
+           gtk_spin_button_default_output (spin_button);
+       }
+    }
+}
index aad6b23b15adb8bf3c28a7d115fa8c80fbae3189..f07074ba449fa9f628d616f7fedc03b34f331f58 100644 (file)
@@ -47,6 +47,7 @@ extern "C" {
 #define GTK_IS_SPIN_BUTTON(obj)               (GTK_CHECK_TYPE ((obj), GTK_TYPE_SPIN_BUTTON))
 #define GTK_IS_SPIN_BUTTON_CLASS(klass)       (GTK_CHECK_CLASS_TYPE ((klass), GTK_TYPE_SPIN_BUTTON))
 
+#define INPUT_ERROR -1
 
 typedef enum
 {
@@ -101,6 +102,10 @@ struct _GtkSpinButton
 struct _GtkSpinButtonClass
 {
   GtkEntryClass parent_class;
+
+  gint (*input)  (GtkSpinButton *spin_button,
+                 gfloat        *new_value);
+  gint (*output) (GtkSpinButton *spin_button);
 };
 
 
index 3d979f5d69f0a2a50d3b58aae51b26b663d8960f..fef132601f3354cdfa04ea147138860084cb75bc 100644 (file)
@@ -2873,6 +2873,104 @@ get_value (GtkWidget *widget, gpointer data)
   gtk_label_set_text (label, buf);
 }
 
+static gint
+spin_button_time_output_func (GtkSpinButton *spin_button)
+{
+  static gchar buf[6];
+  gfloat hours;
+  gfloat minutes;
+
+  hours = spin_button->adjustment->value / 60.0;
+  minutes = (fabs(floor (hours) - hours) < 1e-5) ? 0.0 : 30;
+  sprintf (buf, "%02.0f:%02.0f", floor (hours), minutes);
+  if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
+    gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
+  return TRUE;
+}
+
+static gint
+spin_button_month_input_func (GtkSpinButton *spin_button,
+                             gfloat        *new_val)
+{
+  gint i;
+  static gchar *month[12] = { "January", "February", "March", "April",
+                             "May", "June", "July", "August",
+                             "September", "October", "November", "December" };
+  gchar *tmp1, *tmp2;
+  gboolean found = FALSE;
+
+  for (i = 1; i <= 12; i++)
+    {
+      tmp1 = g_strdup (month[i-1]);
+      g_strup (tmp1);
+      tmp2 = g_strdup (gtk_entry_get_text (GTK_ENTRY (spin_button)));
+      g_strup (tmp2);
+      if (strstr (tmp1, tmp2) == tmp1)
+       found = TRUE;
+      g_free (tmp1);
+      g_free (tmp2);
+      if (found)
+       break;
+    }
+  if (!found)
+    {
+      *new_val = 0.0;
+      return INPUT_ERROR;
+    }
+  *new_val = (gfloat) i;
+  return TRUE;
+}
+
+static gint
+spin_button_month_output_func (GtkSpinButton *spin_button)
+{
+  gint i;
+  static gchar *month[12] = { "January", "February", "March", "April",
+                             "May", "June", "July", "August", "September",
+                             "October", "November", "December" };
+
+  for (i = 1; i <= 12; i++)
+    if (fabs (spin_button->adjustment->value - (double)i) < 1e-5)
+      {
+       if (strcmp (month[i-1], gtk_entry_get_text (GTK_ENTRY (spin_button))))
+         gtk_entry_set_text (GTK_ENTRY (spin_button), month[i-1]);
+      }
+  return TRUE;
+}
+
+static gint
+spin_button_hex_input_func (GtkSpinButton *spin_button,
+                           gfloat        *new_val)
+{
+  gchar *buf;
+  gchar *err;
+  gfloat res;
+
+  buf = gtk_entry_get_text (GTK_ENTRY (spin_button));
+  res = (gfloat)(strtol(buf, &err, 16));
+  *new_val = res;
+  if (*err)
+    return INPUT_ERROR;
+  else
+    return TRUE;
+}
+
+static gint
+spin_button_hex_output_func (GtkSpinButton *spin_button)
+{
+  static gchar buf[7];
+  gint val;
+
+  val = (gint) spin_button->adjustment->value;
+  if (fabs (val) < 1e-5)
+    sprintf (buf, "0x00");
+  else
+    sprintf (buf, "0x%.2X", val);
+  if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
+    gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
+  return TRUE;
+}
+
 static void
 create_spins (void)
 {
@@ -2910,7 +3008,7 @@ create_spins (void)
       gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
       gtk_container_add (GTK_CONTAINER (frame), vbox);
       
-      /* Day, month, year spinners */
+      /* Time, month, hex spinners */
       
       hbox = gtk_hbox_new (FALSE, 0);
       gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
@@ -2918,16 +3016,19 @@ create_spins (void)
       vbox2 = gtk_vbox_new (FALSE, 0);
       gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
       
-      label = gtk_label_new ("Day :");
+      label = gtk_label_new ("Time :");
       gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
       gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
       
-      adj = (GtkAdjustment *) gtk_adjustment_new (1.0, 1.0, 31.0, 1.0,
-                                                 5.0, 0.0);
+      adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 1410, 30, 60, 0);
       spinner = gtk_spin_button_new (adj, 0, 0);
+      gtk_editable_set_editable (GTK_EDITABLE (spinner), FALSE);
+      gtk_signal_connect (GTK_OBJECT (spinner),
+                         "output",
+                         GTK_SIGNAL_FUNC (spin_button_time_output_func),
+                         NULL);
       gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
-      gtk_spin_button_set_shadow_type (GTK_SPIN_BUTTON (spinner),
-                                      GTK_SHADOW_OUT);
+      gtk_widget_set_usize (spinner, 55, -1);
       gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
 
       vbox2 = gtk_vbox_new (FALSE, 0);
@@ -2940,24 +3041,39 @@ create_spins (void)
       adj = (GtkAdjustment *) gtk_adjustment_new (1.0, 1.0, 12.0, 1.0,
                                                  5.0, 0.0);
       spinner = gtk_spin_button_new (adj, 0, 0);
+      gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinner),
+                                        GTK_UPDATE_IF_VALID);
+      gtk_signal_connect (GTK_OBJECT (spinner),
+                         "input",
+                         GTK_SIGNAL_FUNC (spin_button_month_input_func),
+                         NULL);
+      gtk_signal_connect (GTK_OBJECT (spinner),
+                         "output",
+                         GTK_SIGNAL_FUNC (spin_button_month_output_func),
+                         NULL);
       gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
-      gtk_spin_button_set_shadow_type (GTK_SPIN_BUTTON (spinner),
-                                      GTK_SHADOW_ETCHED_IN);
+      gtk_widget_set_usize (spinner, 85, -1);
       gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
       
       vbox2 = gtk_vbox_new (FALSE, 0);
       gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
 
-      label = gtk_label_new ("Year :");
+      label = gtk_label_new ("Hex :");
       gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
       gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
 
-      adj = (GtkAdjustment *) gtk_adjustment_new (1998.0, 0.0, 2100.0, 
-                                                 1.0, 100.0, 0.0);
+      adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 255, 1, 16, 0);
       spinner = gtk_spin_button_new (adj, 0, 0);
+      gtk_editable_set_editable (GTK_EDITABLE (spinner), TRUE);
+      gtk_signal_connect (GTK_OBJECT (spinner),
+                         "input",
+                         GTK_SIGNAL_FUNC (spin_button_hex_input_func),
+                         NULL);
+      gtk_signal_connect (GTK_OBJECT (spinner),
+                         "output",
+                         GTK_SIGNAL_FUNC (spin_button_hex_output_func),
+                         NULL);
       gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
-      gtk_spin_button_set_shadow_type (GTK_SPIN_BUTTON (spinner),
-                                      GTK_SHADOW_IN);
       gtk_widget_set_usize (spinner, 55, 0);
       gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
 
@@ -2994,7 +3110,6 @@ create_spins (void)
 
       adj = (GtkAdjustment *) gtk_adjustment_new (2, 1, 5, 1, 1, 0);
       spinner2 = gtk_spin_button_new (adj, 0.0, 0);
-      gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner2), TRUE);
       gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
                          GTK_SIGNAL_FUNC (change_digits),
                          (gpointer) spinner2);
@@ -3055,6 +3170,7 @@ create_spins (void)
     gtk_widget_destroy (window);
 }
 
+
 /*
  * Cursors
  */
index 3d979f5d69f0a2a50d3b58aae51b26b663d8960f..fef132601f3354cdfa04ea147138860084cb75bc 100644 (file)
@@ -2873,6 +2873,104 @@ get_value (GtkWidget *widget, gpointer data)
   gtk_label_set_text (label, buf);
 }
 
+static gint
+spin_button_time_output_func (GtkSpinButton *spin_button)
+{
+  static gchar buf[6];
+  gfloat hours;
+  gfloat minutes;
+
+  hours = spin_button->adjustment->value / 60.0;
+  minutes = (fabs(floor (hours) - hours) < 1e-5) ? 0.0 : 30;
+  sprintf (buf, "%02.0f:%02.0f", floor (hours), minutes);
+  if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
+    gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
+  return TRUE;
+}
+
+static gint
+spin_button_month_input_func (GtkSpinButton *spin_button,
+                             gfloat        *new_val)
+{
+  gint i;
+  static gchar *month[12] = { "January", "February", "March", "April",
+                             "May", "June", "July", "August",
+                             "September", "October", "November", "December" };
+  gchar *tmp1, *tmp2;
+  gboolean found = FALSE;
+
+  for (i = 1; i <= 12; i++)
+    {
+      tmp1 = g_strdup (month[i-1]);
+      g_strup (tmp1);
+      tmp2 = g_strdup (gtk_entry_get_text (GTK_ENTRY (spin_button)));
+      g_strup (tmp2);
+      if (strstr (tmp1, tmp2) == tmp1)
+       found = TRUE;
+      g_free (tmp1);
+      g_free (tmp2);
+      if (found)
+       break;
+    }
+  if (!found)
+    {
+      *new_val = 0.0;
+      return INPUT_ERROR;
+    }
+  *new_val = (gfloat) i;
+  return TRUE;
+}
+
+static gint
+spin_button_month_output_func (GtkSpinButton *spin_button)
+{
+  gint i;
+  static gchar *month[12] = { "January", "February", "March", "April",
+                             "May", "June", "July", "August", "September",
+                             "October", "November", "December" };
+
+  for (i = 1; i <= 12; i++)
+    if (fabs (spin_button->adjustment->value - (double)i) < 1e-5)
+      {
+       if (strcmp (month[i-1], gtk_entry_get_text (GTK_ENTRY (spin_button))))
+         gtk_entry_set_text (GTK_ENTRY (spin_button), month[i-1]);
+      }
+  return TRUE;
+}
+
+static gint
+spin_button_hex_input_func (GtkSpinButton *spin_button,
+                           gfloat        *new_val)
+{
+  gchar *buf;
+  gchar *err;
+  gfloat res;
+
+  buf = gtk_entry_get_text (GTK_ENTRY (spin_button));
+  res = (gfloat)(strtol(buf, &err, 16));
+  *new_val = res;
+  if (*err)
+    return INPUT_ERROR;
+  else
+    return TRUE;
+}
+
+static gint
+spin_button_hex_output_func (GtkSpinButton *spin_button)
+{
+  static gchar buf[7];
+  gint val;
+
+  val = (gint) spin_button->adjustment->value;
+  if (fabs (val) < 1e-5)
+    sprintf (buf, "0x00");
+  else
+    sprintf (buf, "0x%.2X", val);
+  if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
+    gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
+  return TRUE;
+}
+
 static void
 create_spins (void)
 {
@@ -2910,7 +3008,7 @@ create_spins (void)
       gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
       gtk_container_add (GTK_CONTAINER (frame), vbox);
       
-      /* Day, month, year spinners */
+      /* Time, month, hex spinners */
       
       hbox = gtk_hbox_new (FALSE, 0);
       gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
@@ -2918,16 +3016,19 @@ create_spins (void)
       vbox2 = gtk_vbox_new (FALSE, 0);
       gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
       
-      label = gtk_label_new ("Day :");
+      label = gtk_label_new ("Time :");
       gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
       gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
       
-      adj = (GtkAdjustment *) gtk_adjustment_new (1.0, 1.0, 31.0, 1.0,
-                                                 5.0, 0.0);
+      adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 1410, 30, 60, 0);
       spinner = gtk_spin_button_new (adj, 0, 0);
+      gtk_editable_set_editable (GTK_EDITABLE (spinner), FALSE);
+      gtk_signal_connect (GTK_OBJECT (spinner),
+                         "output",
+                         GTK_SIGNAL_FUNC (spin_button_time_output_func),
+                         NULL);
       gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
-      gtk_spin_button_set_shadow_type (GTK_SPIN_BUTTON (spinner),
-                                      GTK_SHADOW_OUT);
+      gtk_widget_set_usize (spinner, 55, -1);
       gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
 
       vbox2 = gtk_vbox_new (FALSE, 0);
@@ -2940,24 +3041,39 @@ create_spins (void)
       adj = (GtkAdjustment *) gtk_adjustment_new (1.0, 1.0, 12.0, 1.0,
                                                  5.0, 0.0);
       spinner = gtk_spin_button_new (adj, 0, 0);
+      gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinner),
+                                        GTK_UPDATE_IF_VALID);
+      gtk_signal_connect (GTK_OBJECT (spinner),
+                         "input",
+                         GTK_SIGNAL_FUNC (spin_button_month_input_func),
+                         NULL);
+      gtk_signal_connect (GTK_OBJECT (spinner),
+                         "output",
+                         GTK_SIGNAL_FUNC (spin_button_month_output_func),
+                         NULL);
       gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
-      gtk_spin_button_set_shadow_type (GTK_SPIN_BUTTON (spinner),
-                                      GTK_SHADOW_ETCHED_IN);
+      gtk_widget_set_usize (spinner, 85, -1);
       gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
       
       vbox2 = gtk_vbox_new (FALSE, 0);
       gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
 
-      label = gtk_label_new ("Year :");
+      label = gtk_label_new ("Hex :");
       gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
       gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
 
-      adj = (GtkAdjustment *) gtk_adjustment_new (1998.0, 0.0, 2100.0, 
-                                                 1.0, 100.0, 0.0);
+      adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 255, 1, 16, 0);
       spinner = gtk_spin_button_new (adj, 0, 0);
+      gtk_editable_set_editable (GTK_EDITABLE (spinner), TRUE);
+      gtk_signal_connect (GTK_OBJECT (spinner),
+                         "input",
+                         GTK_SIGNAL_FUNC (spin_button_hex_input_func),
+                         NULL);
+      gtk_signal_connect (GTK_OBJECT (spinner),
+                         "output",
+                         GTK_SIGNAL_FUNC (spin_button_hex_output_func),
+                         NULL);
       gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
-      gtk_spin_button_set_shadow_type (GTK_SPIN_BUTTON (spinner),
-                                      GTK_SHADOW_IN);
       gtk_widget_set_usize (spinner, 55, 0);
       gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
 
@@ -2994,7 +3110,6 @@ create_spins (void)
 
       adj = (GtkAdjustment *) gtk_adjustment_new (2, 1, 5, 1, 1, 0);
       spinner2 = gtk_spin_button_new (adj, 0.0, 0);
-      gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner2), TRUE);
       gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
                          GTK_SIGNAL_FUNC (change_digits),
                          (gpointer) spinner2);
@@ -3055,6 +3170,7 @@ create_spins (void)
     gtk_widget_destroy (window);
 }
 
+
 /*
  * Cursors
  */